package com.lixin.aopdemo;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

// 这个类主要用来生成代理类
public class ProxyInvocationHandler implements InvocationHandler {

    // 被代理的类
    private Object target;

    public void setTarget(Object obj) {
        this.target = obj;
    }

    // 实例化并获得代理类，这个代理类是通过反射动态生成的
    public Object getProxy() {
        Class<?> clazz = target.getClass();
        return Proxy.newProxyInstance(
                clazz.getClassLoader(), // 被代理类的类加载器
                clazz.getInterfaces(), // 被代理类实现的所有接口
                this // 当前InvocationHandler
        );
    }

    // 在调用代理类的某个方法时，这里会自动执行
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("调用了" + method.getName() + "方法");
        System.out.println("我是中介，我带你看房");
        System.out.println("收房租和管理费");
        System.out.println("和你签合同");
        System.out.println("我去找这个房子真实的房东");

        // 实际执行调用方法
        Object result = method.invoke(target, args);

        System.out.println("你入住了");
        return result;
    }

}
